<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>闭包</title>
    <script>
      /*
          创建一个函数，第一次调用时打印1，第二次调用打印2，以此类推
          为了尽量避免全局变量，所以我们要把变量藏起来
  
          闭包：
              指能访问到外部函数作用域中变量的函数，可在需要隐藏一些内容时使用
              构成条件：
                  1.函数嵌套
                  2.内部函数要引用外部函数中的变量
                  3.内部函数要作为返回值返回
  
          词法作用域
  
          */

      function outer() {
        let num = 0;
        return () => {
          num++;
          console.log(num);
        };
      }

      const newFn = outer();

      console.log(outer()); //输出方法outer（）
      console.log(outer()()); //调用outer（）始终返回1
      console.log(newFn()); //返回值逐渐增大

      /*
          函数作用域在函数创建时就已经确定，与被调用位置无关
          */

      let a = "全局变量a";
      function fn() {
        console.log(a);
      }

      function fn2() {
        let a = "fn2中的a";
        console.log(a); //fn2中的a

        fn(); //全局变量a,函数fn()创建在全局中，所以也输出全局a
      }

      fn2();
    </script>
  </head>

  <body></body>
</html>
